#include "Tuple3D.h"

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
Tuple3D::Tuple3D(void) :
    x(0), y(0), z(0), valid(true)
{
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
Tuple3D::Tuple3D(double x, double y, double z) :
    x(x), y(y), z(z), valid(true)
{
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
void Tuple3D::add(const Tuple3D t1)
{
    x += t1.x;
    y += t1.y;
    z += t1.z;
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
void Tuple3D::scale(double s)
{
    x *= s;
    y *= s;
    z *= s;
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
void Tuple3D::sub(const Tuple3D t1)
{
    x -= t1.x;
    y -= t1.y;
    z -= t1.z;
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
bool Tuple3D::operator==(const Tuple3D &other) const
{
    if (dIsApprox(x, other.x) &&
            dIsApprox(y, other.y) &&
            dIsApprox(z, other.z) &&
            (valid == other.valid))
        return true;
    else
        return false;
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
bool Tuple3D::operator!=(const Tuple3D &other) const
{
    return !(*this == other);
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
bool operator<(const Tuple3D &lhs, const Tuple3D &rhs)
{
    return (lhs.x + lhs.y + lhs.z) < (rhs.x + rhs.y + rhs.z);
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
std::ostream & operator<<(std::ostream &strm, const Tuple3D &t)
{
    return strm << "(" << t.x << ", " << t.y << ", " << t.z << ")";
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
size_t hash_value(Tuple3D const& t)
{
    boost::hash<double> hasher;
    return hasher(t.x) + hasher(t.y) + hasher(t.z);
}
